import {Injectable} from '@angular/core';
import {Stomp} from '../../assets/socket/stomp.min.js';
import * as SockJS from '../../assets/socket/sockjs.min.js';

@Injectable({
    providedIn: 'root'
})

export class WebsocketService {
    // 存储发出过websocket连接对象
    stompClientArr: Array<any> = [];

    /**
     * @method getBySocket 通过Http获取数据
     * @param socketUrl 建立socket主机地址
     * @param classUrl:模块地址
     * @param callback 数据回调函数
     */
    getBySocket(socketUrl: string,classUrl:string, callback) {
        const that = this;
        // 创建websocket连接对象
        const socket = new SockJS(socketUrl);
        const stompClient = Stomp.over(socket);
        // 向后台发出连接信息
        stompClient.connect({}, (frame) => {
            console.log('connect success!');
            // 连接成功保存连接成功后的stompClient对象，用于后续主动关闭websocket
            that.stompClientArr.push({
                // 服务类地址
                classUrl: classUrl,
                // 服务建立成功后说得建立对性
                stompClient: stompClient
            });
            // 建立数据推送与解析
            stompClient.subscribe(classUrl,(message) => {
                const info = JSON.parse(message.body);
                // 回调数据对象
                callback(info);
            });

        });
    }

    /**
     * @method offSocket 关闭websocket
     * @param classUrl 模块地址
     * @author 周贞荣
     */
    toffSocket(classUrl) {
        // 存儲需要保留的socket
        const indexList = [];
        // 對已建立的鏈接訓話
        this.stompClientArr.forEach((item) => {
            // 初始為關閉這條socket
            let off = true;
            classUrl.forEach(itema => {
                // 如果查詢到這個socket在保留列表中保留他
                if (item.classUrl === itema || item.classUrl === itema + '') {
                    off = false;
                    indexList.push(item);
                }
            });
            if (off) {
                // 不在需要保留的列表中，關閉
                item.stompClient.disconnect();
            }
        });
        // 更新socket列表
        this.stompClientArr = indexList;
    }
}
